#include <iostream>
#include <signal.h>
#include <unistd.h>

using namespace std;

void handler(int signo)
{
    cout << "子进程退出啦，我确实收到了信号: " << signo << " 我是: " << getpid() << endl;
}

int main()
{
    signal(SIGCHLD, handler);
    pid_t id = fork();
    if (id == 0)
    {
        while (true)
        {
            cout << "我是子进程: " << getpid() << endl;
            sleep(1);
        }
        exit(0);
    }

    // parent
    while (true)
    {
        cout << "我是父进程: " << getpid() << endl;
        sleep(1);
    }
}

#include <stdio.h>
#include <signal.h>

// // // 保持内存的可见性
// volatile int flags = 0;

// void handler(int signo)
// {
//     flags = 1;
//     printf("更改flags: 0->1\n");
// }

// int main()
// {
//     // 可以同时修饰一个变量吗？？
//     // 含义冲突吗，该变量代表什么含义？
//     volatile const int a = 100;

//     signal(2, handler);

//     while (!flags);
//     printf("进程是正常退出的!\n");

//     return 0;
// }

// #include <iostream>
// #include <vector>
// #include <unistd.h>
// #include <signal.h>
// using namespace std;

// void handler(int signo)
// {
//     cout << "获取到一个信号,信号的编号是: " << signo << endl;
//     sigset_t pending;
//      //增加handler信号的时间,永远都会正在处理2号信号！
//     while (true)
//     {
//         cout << "." << endl;
//         sigpending(&pending);
//         for(int i = 1; i <=31; i++){
//             if(sigismember(&pending, i)) cout << '1';
//             else cout << '0';
//         }
//         cout << endl;
//         sleep(1);
//     }
// }

// // // 局限性，需要你对所有的信号进行捕捉
// // std::vector<sighandler_t> handler;

// //  unordered_map<int, sighandler_t>

// // void Handler2()
// // {
// //     cout << "hello 2" << endl;
// // }
// // void Handler3()
// // {
// //     cout << "hello 3" << endl;
// // }
// // void Handler4()
// // {
// //     cout << "hello 4" << endl;
// // }
// // void Handler5()
// // {
// //     cout << "hello 5" << endl;
// // }
// // void Handler(int signo)
// // {
// //     switch (signo)
// //     {
// //     case 2:
// //         Handler2();
// //         break;
// //     case 3:
// //         Handler3();
// //         break;
// //     case 4:
// //         Handler4();
// //         break;
// //     case 5:
// //         Handler5();
// //         break;
// //     default:
// //         break;
// //     }
// // }

// int main()
// {
//     // signal(2, Handler);
//     // signal(3, Handler);
//     // signal(4, Handler);
//     // signal(5, Handler);

//     // while(1)
//     // {
//     //     sleep(1);
//     // }

//    //()[]{} lanbda
//     struct sigaction act, oact;
//      act.sa_handler = handler;
//     //act.sa_handler = SIG_IGN;
//     // act.sa_handler = SIG_DFL;
   
//     act.sa_flags = 0;
//     sigemptyset(&act.sa_mask);
//     sigaddset(&act.sa_mask, 3);
//     sigaction(2, &act, &oact);

//     while (true)
//     {
//         cout << "main running" << endl;
//         sleep(1);
//     }
//     return 0;
// }
